problem with transactions in VB.NET using npgsql - Mailing list pgsql-general

From Owen Hartnett
Subject problem with transactions in VB.NET using npgsql
Date
Msg-id p06230901c2f8d9d00cf1@[192.168.0.102]
Whole thread Raw
In response to Re: Removing pollution from log files  (Andrew Sullivan <ajs@crankycanuck.ca>)
Responses Re: problem with transactions in VB.NET using npgsql  (Tom Lane <tgl@sss.pgh.pa.us>)
List pgsql-general
Maybe someone here can figure it out.  Everything updates fine with
this code, except where there's an exception, it's not rolling back
by the transaction.  What I'm trying to do:

Begin a transaction
Do the update, insert, delete checks on each of the data tables,
using a different npgsqlcommandbuilder for each of the tables.
Commit
if any failure happens, roll back all the changes to the transaction beginning.

I assign the transaction object to each of the commands, but it seems
that some tables will get updated, even when I call rollback.  Is
something I'm calling secretly calling "commit" somewhere?

My code follows.  Thanks for checking it over.  Sorry about the
length, but I wanted you to see that I'm updating multiple tables
with multiple dataadapters.

-Owen

Option Explicit On
Imports System.Windows.Forms
Imports npgsql
Imports System.Xml.Serialization
Imports System.IO
Imports System.Collections.Generic
Imports System.Configuration
' Note: some controls, in the forms designer, cover other controls,
i.e. CommUsageCB covers styleCB
Public Class ParcelDisplayFrm

     Public Sub WriteAllData()
         Dim trans As NpgsqlTransaction = Nothing
         Dim cmd As NpgsqlCommandBuilder
         Dim i As Integer
         Dim success As Boolean

         Try
             If Not statusReadOnly Then
                 i = vbCancel
                 success = priceIt(Me, full_DataSet, True, True, pc)
                 dt = full_DataSet.Tables(currentSchema & ".parcel")

                 dt.Rows(0).EndEdit()
                 dt = full_DataSet.Tables(currentSchema & ".accounts")
                 dt.Rows(0).EndEdit()
                 dt = full_DataSet.Tables(currentSchema & ".bldg")
                 For i = 0 To dt.Rows.Count - 1
                     dt.Rows(i).EndEdit()
                 Next i
                 dt = full_DataSet.Tables(currentSchema & ".commcost")
                 For i = 0 To dt.Rows.Count - 1
                     dt.Rows(i).EndEdit()
                 Next i
                 dt = full_DataSet.Tables(currentSchema & ".outbuildings")
                 For i = 0 To dt.Rows.Count - 1
                     If dt.Rows(i).RowState = DataRowState.Added Then
                         dt.Rows(i).Item("maplot") = Form1.currentMapLot
                     End If
                     Debug.Print(dt.Rows.Count)
                     dt.Rows(i).EndEdit()
                 Next i
                 If Not dirtySketch And Not full_DataSet.HasChanges Then
                     Exit Sub    ' Nothing to change
                 End If

                 Dim dg As New SaveChangesDlog
                 If dg.ShowDialog = Windows.Forms.DialogResult.Cancel
Then Exit Sub ' don't save
                 writeFinalize()
                 dt = full_DataSet.Tables(currentSchema & ".parcel")
                 m_SqlConnection.Open()
' create a transaction for the rest of all the changes

                 trans = m_SqlConnection.BeginTransaction

                 cmd = New NpgsqlCommandBuilder(parcel_DataAdapter)


                 Dim parcelchanges As DataTable =
dt.GetChanges(DataRowState.Modified)

                 If parcelchanges IsNot Nothing Then
                     parcel_DataAdapter.UpdateCommand =
cmd.GetUpdateCommand(dt.Rows(0))
                     parcel_DataAdapter.UpdateCommand.Transaction = trans

                     parcel_DataAdapter.Update(parcelchanges)
                 End If
                 parcelchanges = dt.GetChanges(DataRowState.Deleted)
                 If parcelchanges IsNot Nothing Then
                     parcel_DataAdapter.DeleteCommand =
cmd.GetDeleteCommand(dt.Rows(0))
                     parcel_DataAdapter.DeleteCommand.Transaction = trans

                     parcel_DataAdapter.Update(parcelchanges)
                 End If
                 parcelchanges = dt.GetChanges(DataRowState.Added)
                 If parcelchanges IsNot Nothing Then
                     parcel_DataAdapter.InsertCommand =
cmd.GetInsertCommand(dt.Rows(0))

                     parcel_DataAdapter.InsertCommand.Transaction = trans

                     parcel_DataAdapter.Update(parcelchanges)
                 End If

                 ' accounts table
                 cmd = New NpgsqlCommandBuilder(accts_DataAdapter)
                 dt = full_DataSet.Tables(currentSchema & ".accounts")
                 Dim acctchanges As DataTable =
dt.GetChanges(DataRowState.Modified)

                 If acctchanges IsNot Nothing Then
                     accts_DataAdapter.UpdateCommand =
cmd.GetUpdateCommand(dt.Rows(0))
                     accts_DataAdapter.UpdateCommand.Transaction = trans

                     accts_DataAdapter.Update(acctchanges)
                 End If
                 acctchanges = dt.GetChanges(DataRowState.Deleted)
                 If acctchanges IsNot Nothing Then
                     accts_DataAdapter.DeleteCommand =
cmd.GetDeleteCommand(dt.Rows(0))
                     accts_DataAdapter.DeleteCommand.Transaction = trans

                     accts_DataAdapter.Update(acctchanges)
                 End If
                 acctchanges = dt.GetChanges(DataRowState.Added)
                 If acctchanges IsNot Nothing Then
                     accts_DataAdapter.InsertCommand =
cmd.GetInsertCommand(dt.Rows(0))

                     accts_DataAdapter.InsertCommand.Transaction = trans

                     accts_DataAdapter.Update(acctchanges)
                 End If

                 ' do for every building
                 dt = full_DataSet.Tables(currentSchema & ".bldg")
                 If dt.Rows.Count > 0 Then
                     If dirtySketch Then
                         For i = currentBuilding To howManyBuildings - 1

returnSketchToDatabase(dt.Rows(0).Item("maplot"), i, trans, Me)
                         Next i
                     End If
                     cmd = New NpgsqlCommandBuilder(bldg_DataAdapter)

                     ' add modified dates
                     addModDates(dt, "modified")


                     'Debug.Print(ZoningCode.DataBindings.BindableComponent)
                     Dim bldgchanges As DataTable =
dt.GetChanges(DataRowState.Deleted)
                     If bldgchanges IsNot Nothing Then
                         bldg_DataAdapter.DeleteCommand =
cmd.GetDeleteCommand(dt.Rows(0))
                         bldg_DataAdapter.DeleteCommand.Transaction = trans

                         bldg_DataAdapter.Update(bldgchanges)
                     End If
                     bldgchanges = dt.GetChanges(DataRowState.Modified)
                     If bldgchanges IsNot Nothing Then
                         Dim j As Integer = 0
                         While dt.Rows(j).RowState = DataRowState.Deleted
                             j = j + 1
                         End While
                         bldg_DataAdapter.UpdateCommand =
cmd.GetUpdateCommand(dt.Rows(j))
                         bldg_DataAdapter.UpdateCommand.Transaction = trans

                         bldg_DataAdapter.Update(bldgchanges)
                     End If
                     bldgchanges = dt.GetChanges(DataRowState.Added)
                     If bldgchanges IsNot Nothing Then
                         bldg_DataAdapter.InsertCommand =
cmd.GetInsertCommand(dt.Rows(0))
                         bldg_DataAdapter.InsertCommand.Transaction = trans

                         bldg_DataAdapter.Update(bldgchanges)
                     End If
                 End If

                 dt = full_DataSet.Tables(currentSchema & ".commcost")
                 If dt.Rows.Count > 0 Then
                     cmd = New NpgsqlCommandBuilder(commbldg_DataAdapter)

                     'Debug.Print(ZoningCode.DataBindings.BindableComponent)
                     Dim commBldgChanges As DataTable
                     commBldgChanges = dt.GetChanges(DataRowState.Deleted)
                     If commBldgChanges IsNot Nothing Then
                         commbldg_DataAdapter.DeleteCommand =
cmd.GetDeleteCommand(dt.Rows(0))
                         commbldg_DataAdapter.DeleteCommand.Transaction = trans

                         commbldg_DataAdapter.Update(commBldgChanges)
                     End If
                     commBldgChanges = dt.GetChanges(DataRowState.Modified)
                     If commBldgChanges IsNot Nothing Then
                         Dim j As Integer = 0
                         While dt.Rows(j).RowState = DataRowState.Deleted
                             j = j + 1
                         End While
                         commbldg_DataAdapter.UpdateCommand =
cmd.GetUpdateCommand(dt.Rows(j))
                         commbldg_DataAdapter.UpdateCommand.Transaction = trans

                         commbldg_DataAdapter.Update(commBldgChanges)
                     End If
                     commBldgChanges = dt.GetChanges(DataRowState.Added)
                     If commBldgChanges IsNot Nothing Then
                         Dim j As Integer = 0
                         While dt.Rows(j).RowState = DataRowState.Deleted
                             j = j + 1
                         End While
                         commbldg_DataAdapter.InsertCommand =
cmd.GetInsertCommand(dt.Rows(j))
                         commbldg_DataAdapter.InsertCommand.Transaction = trans

                         commbldg_DataAdapter.Update(commBldgChanges)
                     End If
                 End If

                 dt = full_DataSet.Tables(currentSchema & ".outbuildings")
                 If dt.Rows.Count > 0 Then
                     cmd = New NpgsqlCommandBuilder(outbldg_DataAdapter)

                     For i = 0 To dt.Rows.Count - 1
                         If dt.Rows(i).RowState = DataRowState.Added Then
                             dt.Rows(i).Item("MapLot") =
full_DataSet.Tables(currentSchema & ".parcel").Rows(0).Item("MapLot")
                         End If
                     Next i
                     'Debug.Print(ZoningCode.DataBindings.BindableComponent)
                     Dim outchanges As DataTable
                     outchanges = dt.GetChanges(DataRowState.Deleted)
                     If outchanges IsNot Nothing Then
                         outbldg_DataAdapter.DeleteCommand =
cmd.GetDeleteCommand(dt.Rows(0))
                         outbldg_DataAdapter.DeleteCommand.Transaction = trans

                         outbldg_DataAdapter.Update(outchanges)
                     End If
                     outchanges = dt.GetChanges(DataRowState.Modified)
                     If outchanges IsNot Nothing Then
                         Dim j As Integer = 0
                         While dt.Rows(j).RowState = DataRowState.Deleted
                             j = j + 1
                         End While
                         outbldg_DataAdapter.UpdateCommand =
cmd.GetUpdateCommand(dt.Rows(j))
                         outbldg_DataAdapter.UpdateCommand.Transaction = trans

                         outbldg_DataAdapter.Update(outchanges)

                     End If
                     outchanges = dt.GetChanges(DataRowState.Added)
                     If outchanges IsNot Nothing Then
                         Dim j As Integer = 0
                         While dt.Rows(j).RowState = DataRowState.Deleted
                             j = j + 1
                         End While
                         outbldg_DataAdapter.InsertCommand =
cmd.GetInsertCommand(dt.Rows(j))
                         outbldg_DataAdapter.InsertCommand.Transaction = trans

                         outbldg_DataAdapter.Update(outchanges)
                     End If
                 End If
                 ' write changes to sales tables
                 dt = full_DataSet.Tables(currentSchema & ".sales")
                 If dt.Rows.Count > 0 Then
                     cmd = New NpgsqlCommandBuilder(sales_DataAdapter)

                     'Debug.Print(ZoningCode.DataBindings.BindableComponent)
                     Dim salesChanges As DataTable
                     salesChanges = dt.GetChanges(DataRowState.Deleted)
                     If salesChanges IsNot Nothing Then
                         sales_DataAdapter.DeleteCommand =
cmd.GetDeleteCommand(dt.Rows(0))
                         sales_DataAdapter.DeleteCommand.Transaction = trans

                         sales_DataAdapter.Update(salesChanges)
                     End If
                     salesChanges = dt.GetChanges(DataRowState.Modified)
                     If salesChanges IsNot Nothing Then
                         Dim j As Integer = 0
                         While dt.Rows(j).RowState = DataRowState.Deleted
                             j = j + 1
                         End While
                         sales_DataAdapter.UpdateCommand =
cmd.GetUpdateCommand(dt.Rows(j))
                         sales_DataAdapter.UpdateCommand.Transaction = trans

                         sales_DataAdapter.Update(salesChanges)
                     End If
                     salesChanges = dt.GetChanges(DataRowState.Added)
                     If salesChanges IsNot Nothing Then
                         Dim j As Integer = 0
                         While dt.Rows(j).RowState = DataRowState.Deleted
                             j = j + 1
                         End While
                         sales_DataAdapter.InsertCommand =
cmd.GetInsertCommand(dt.Rows(j))
                         sales_DataAdapter.InsertCommand.Transaction = trans

                         sales_DataAdapter.Update(salesChanges)
                     End If
                 End If
                 ' write changes to sales overflow table
                 dt = full_DataSet.Tables(currentSchema & ".salesovflowtype")
                 If dt.Rows.Count > 0 Then
                     cmd = New NpgsqlCommandBuilder(salesOF_DataAdapter)

                     'Debug.Print(ZoningCode.DataBindings.BindableComponent)
                     Dim salesOFChanges As DataTable
                     salesOFChanges = dt.GetChanges(DataRowState.Deleted)
                     If salesOFChanges IsNot Nothing Then
                         salesOF_DataAdapter.DeleteCommand =
cmd.GetDeleteCommand(dt.Rows(0))
                         salesOF_DataAdapter.DeleteCommand.Transaction = trans

                         salesOF_DataAdapter.Update(salesOFChanges)
                     End If
                     salesOFChanges = dt.GetChanges(DataRowState.Modified)
                     If salesOFChanges IsNot Nothing Then
                         Dim j As Integer = 0
                         While dt.Rows(j).RowState = DataRowState.Deleted
                             j = j + 1
                         End While
                         salesOF_DataAdapter.UpdateCommand =
cmd.GetUpdateCommand(dt.Rows(j))
                         salesOF_DataAdapter.UpdateCommand.Transaction = trans

                         salesOF_DataAdapter.Update(salesOFChanges)
                     End If
                     salesOFChanges = dt.GetChanges(DataRowState.Added)
                     If salesOFChanges IsNot Nothing Then
                         Dim j As Integer = 0
                         While dt.Rows(j).RowState = DataRowState.Deleted
                             j = j + 1
                         End While
                         salesOF_DataAdapter.InsertCommand =
cmd.GetInsertCommand(dt.Rows(j))
                         salesOF_DataAdapter.InsertCommand.Transaction = trans

                         salesOF_DataAdapter.Update(salesOFChanges)
                     End If
                 End If


                 trans.Commit()
                 m_SqlConnection.Close()
                 dirtySketch = False
                 BrowserPanel.Refresh()
             End If
         Catch ex As Exception
             MsgBox(" error on writing data " & ex.Message,
MsgBoxStyle.AbortRetryIgnore)
             If trans IsNot Nothing Then trans.Rollback()
             If m_SqlConnection.State = ConnectionState.Open Then
m_SqlConnection.Close()
         End Try
     End Sub

End Class

pgsql-general by date:

Previous
From: Andrew Sullivan
Date:
Subject: Re: Removing pollution from log files
Next
From: John K Masters
Date:
Subject: Windows Download